package com.example.springexcel.Excel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.example.springexcel.pojo.dto.DataWranglingData;
import com.example.springexcel.pojo.dto.ItemData;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Getter
@Slf4j
public class OrderDataListener implements ReadListener<Map<Integer, String>> {
    private final List<DataWranglingData> orders = new ArrayList<>();

    @Override
    public void invoke(Map<Integer, String> data, AnalysisContext context) {
        DataWranglingData currentOrder = new DataWranglingData();

        // 1. 解析固定列
        //物品名称
        currentOrder.setDate(parseDate(data.get(1)));
        // 工厂
        currentOrder.setFactory(data.get(2));
        // 最后一列是备注
        currentOrder.setRemark(data.get(12));
        // 2. 解析动态物品列
        int itemCount = (12-3) / 3; // 计算物品组数

//        log.info("解析到一条数据: {} {}",itemCount, data.size());

        for (int i = 0; i < itemCount; i++) {
            int baseIndex = 3 + (i * 3);

            ItemData item = new ItemData();
            item.setNameItem(data.get(baseIndex));
            item.setQuantity(parseInt(data.get(baseIndex + 1)));
            item.setUnitPrice(parseBigDecimal(data.get(baseIndex + 2)));
//            log.info("解析到一条数据: {}", item);
            if (item.getNameItem() != null) {
                currentOrder.getItemData().add(item);
            }
        }
//        log.info("解析到一条数据: {}", currentOrder);

        orders.add(currentOrder);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {

    }


    // 辅助方法
    private LocalDate parseDate(String value) {
        if (value == null) {
            return null;
        }
        return LocalDate.parse(value, DateTimeFormatter.ofPattern("yyyy/M/d"));
    }
    private Integer parseInt(String value) {
        if (value == null) {
            return null;
        }
        return Integer.parseInt(value);
    }
    private BigDecimal parseBigDecimal(String value) {
        if (value == null) {
            return null;
        }
        return new BigDecimal(value);
    }

}
